home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #10 (Jul 86) / modula source / MakePath.MOD < prev    next >
Text File  |  1986-04-13  |  6KB  |  203 lines

  1. (* Tom Taylor
  2.    3707 Poinciana Dr. #137
  3.    Santa Clara, CA  95051 *)
  4.  
  5. MODULE MakePath;
  6.  
  7. (* This program demonstrates a use of
  8.    the PBFileManager module.
  9.    The program puts up the SFGetFile
  10.    dialog and allows the user to select
  11.    a file.  The program will then print
  12.    out the full path name to the file.
  13.    Click the mouse to continue and 
  14.    click the SFGetFile's cancel button
  15.    to quit. *)
  16.  
  17.   FROM PBFileManager IMPORT
  18.     PBGetCatInfo, CInfoPBRec,
  19.     HParamBlockRec, PBHGetVInfo;
  20.   FROM PackageManager IMPORT
  21.     SFGetFile, SFReply, SFTypeList;
  22.   FROM SYSTEM IMPORT
  23.     ADR;
  24.   FROM MacSystemTypes IMPORT
  25.     Str255, LongCard;
  26.   FROM Strings IMPORT
  27.     StrMacCat, StrModToMac;
  28.   FROM WindowManager IMPORT
  29.     WindowPtr, GetNewWindow,
  30.     DisposeWindow;
  31.   FROM QuickDraw1 IMPORT
  32.     MoveTo, DrawString,
  33.     SetPort, Point, TextFont;
  34.   FROM DialogManager IMPORT
  35.     StopAlert;
  36.   FROM EventManager IMPORT
  37.     StillDown, Button;
  38.   
  39.   CONST
  40.     MFSInstalled = -1;  (* Location in low
  41.                 memory tells whether
  42.             HFS system installed *)
  43.     HFSvolume = 04244h; (* Value specifying a
  44.                      HFS volume *)
  45.  
  46.   TYPE
  47.     Str255Ptr = POINTER TO Str255;
  48.    
  49.   VAR
  50.     reply       : SFReply;
  51.     typelist    : SFTypeList;
  52.     HFS [03f6h] : INTEGER;
  53.     wind        : WindowPtr;
  54.     behind      : LongCard;
  55.     path        : Str255;
  56.     where       : Point;
  57.     hfsFlag     : BOOLEAN;
  58.  
  59.   PROCEDURE WriteString (s : ARRAY OF CHAR);
  60.   (* This routine simply writes a Modula-2
  61.      style string. *)
  62.     VAR
  63.       macs : Str255;
  64.   BEGIN
  65.     StrModToMac (macs,s);
  66.     DrawString (macs);
  67.   END WriteString;
  68.     
  69.   PROCEDURE MakePath (name : Str255Ptr;
  70.                 vRefNum : INTEGER;
  71.               VAR path : Str255;
  72.               VAR hfsFlag : BOOLEAN);
  73.   (* This procedure, the focus of this
  74.      program, takes a vRefNum (which might
  75.      be a WDRefNum) and figures out the full
  76.      path to the directory.  It does this
  77.      by finding the parent each directory
  78.      until the parent is the root.  This
  79.      procedure works on both MFS and HFS
  80.      Macs. *)
  81.     VAR
  82.       blk              : CInfoPBRec;
  83.       volBlk           : HParamBlockRec;
  84.       getname, volname : Str255;
  85.       len              : CARDINAL;
  86.       
  87.     PROCEDURE CheckError (err : INTEGER);
  88.     BEGIN
  89.       IF err # 0 THEN
  90.         err := StopAlert (1986, NIL);
  91.     HALT
  92.       END;
  93.     END CheckError;
  94.     
  95.   BEGIN
  96.     path    := name^; (* Start the path with
  97.                          the destination file *)
  98.     volname := "";    (* Clear out the volume 
  99.                          name *)
  100.     (* Get the volume info for the desired
  101.        volume.  This calls works on both
  102.        HFS and MFS systems. *)
  103.     WITH volBlk DO
  104.       ioCompletion := NIL;
  105.       ioNamePtr    := ADR(volname);
  106.       ioVRefNum    := vRefNum;
  107.       ioVolIndex   := 0;
  108.       ioVSigWord   := 0;
  109.       CheckError (PBHGetVInfo (ADR(volBlk), FALSE));
  110.     END;
  111.     (* This next line determines whether the HFS
  112.        system is installed and whether the current
  113.        volume is an HFS volume. *)
  114.     hfsFlag := (HFS # MFSInstalled) AND
  115.                (volBlk.ioVSigWord = HFSvolume);
  116.         
  117.     IF hfsFlag THEN
  118.       (* Only attempt to build a path name
  119.          deeper than just a volume and file
  120.      on HFS volumes *)
  121.       WITH blk DO
  122.     ioCompletion := NIL;
  123.     getname      := "";
  124.     ioNamePtr    := ADR(getname);
  125.     ioVRefNum    := vRefNum; (* Probably a WDRefNum *)
  126.     ioFDirIndex  := -1;  (* directory info only *)
  127.     ioDrDirID.r  := 0.0; (* kludge for LongCard zero *)
  128.     CheckError (PBGetCatInfo (ADR(blk), FALSE));
  129.     WHILE (ioDrDirID.h # 0) OR
  130.           (ioDrDirID.l # 2) DO
  131.       (* Keep looping until the directory ID
  132.          is the root directory (dir ID = 2) *)
  133.          
  134.       (* Insert a colon in the path *)
  135.       len := CARDINAL(getname[0]);
  136.       IF len < 255 THEN
  137.         INC(len);
  138.         getname[len] := ':';
  139.         getname[0] := CHAR(len);
  140.       END;
  141.       (* Append the path made so
  142.          far with the piece we
  143.          just got. *)
  144.       StrMacCat(getname,path);
  145.       
  146.       (* Save the partial path
  147.          in path. *)
  148.       path := getname;
  149.   
  150.       getname := "";
  151.       ioFDirIndex := -1;  (* directory info only *)
  152.       ioDrDirID   := ioDrParID; (* Get info about
  153.                                    the parent
  154.                        directory. *)
  155.       CheckError (PBGetCatInfo (ADR(blk), FALSE));
  156.     END;
  157.       END;
  158.     END;
  159.     
  160.     (* Lastly, append the path to the volume name *)
  161.     len := CARDINAL(volname[0]);
  162.     INC(len);
  163.     volname[len] := ':';
  164.     volname[0] := CHAR(len);
  165.     StrMacCat(volname, path);
  166.     path := volname;
  167.   END MakePath;
  168.   
  169. BEGIN
  170.   behind.h := 65535; (* kludge for LongCard -1 *)
  171.   behind.l := behind.h;
  172.   where.h := 100;  (* location of SFGetFile *)
  173.   where.v := 100;
  174.   LOOP
  175.     SFGetFile (where, "", NIL, -1, typelist, NIL, reply);
  176.     WITH reply DO
  177.       IF NOT good THEN EXIT END; (* Exit if user hit cancel *)
  178.       
  179.       (* Figure out path to the file *)
  180.       MakePath (ADR(fName), vRefNum, path, hfsFlag);
  181.       
  182.       TextFont (0); (* so window title comes up right *)
  183.       wind := GetNewWindow (1986, NIL, WindowPtr(behind));
  184.       SetPort (wind);
  185.       MoveTo (5,17);
  186.       WriteString ("The path name on this ");
  187.       IF hfsFlag THEN
  188.         WriteString ("HFS");
  189.       ELSE
  190.         WriteString ("MFS");
  191.       END;
  192.       WriteString (" volume is:");
  193.       MoveTo (5, 37);
  194.       DrawString (path);
  195.       WHILE StillDown () DO END;
  196.       WHILE NOT Button () DO END;
  197.       (* Really need to use GetNextEvent
  198.          so this button press is eaten *)
  199.       DisposeWindow (wind);
  200.     END;
  201.   END;
  202. END MakePath.
  203.